package com.insight.modules.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.insight.common.exception.JeecgBootException;
import com.insight.modules.system.entity.SysPermission;
import com.insight.modules.system.model.TreeModel;

import java.util.List;

/**
 * <p>
 * 菜单权限表 服务类
 * </p>
 *
 * @Author scott
 * @since 2018-12-21
 */
/**
 * 系统权限服务接口，继承MyBatis-Plus IService，提供权限相关操作方法
 */
public interface ISysPermissionService extends IService<SysPermission> {

	/**
	 * 根据父级ID查询子权限列表，用于构造权限树
	 *
	 * @param parentId 父权限ID
	 * @return 子权限树模型列表
	 */
	List<TreeModel> queryListByParentId(String parentId);

	/**
	 * 根据权限ID查询单条权限信息
	 *
	 * @param id 权限ID
	 * @return 权限实体
	 */
	SysPermission queryByPerId(String id);

	/**
	 * 物理删除权限及其相关数据
	 *
	 * @param id 权限ID
	 */
	void deletePermission(String id);

	/**
	 * 逻辑删除权限，一般通过状态标识实现软删除
	 *
	 * @param id 权限ID
	 */
	void deletePermissionLogical(String id);

	/**
	 * 新增权限
	 *
	 * @param sysPermission 权限实体
	 * @throws JeecgBootException 业务异常
	 */
	void addPermission(SysPermission sysPermission) throws JeecgBootException;

	/**
	 * 编辑权限
	 *
	 * @param sysPermission 权限实体
	 * @throws JeecgBootException 业务异常
	 */
	void editPermission(SysPermission sysPermission) throws JeecgBootException;

	/**
	 * 根据用户名查询其拥有的权限列表
	 *
	 * @param username 用户名
	 * @return 权限列表
	 */
	List<SysPermission> queryByUser(String username);

	/**
	 * 根据用户名和状态查询用户拥有的权限对应的平台类型
	 *
	 * @param username 用户名
	 * @param status   权限状态（启用/禁用）
	 * @return 平台类型权限列表
	 */
	List<SysPermission> queryPlatformTypeByUser(String username, Boolean status);

	/**
	 * 根据用户名和平台类型查询用户权限
	 *
	 * @param username     用户名
	 * @param platformType 平台类型
	 * @return 权限列表
	 */
	List<SysPermission> queryByUserAndPlatformType(String username, Integer platformType);

	/**
	 * 根据角色编码和平台类型查询权限列表
	 *
	 * @param roleCode     角色编码
	 * @param platformType 平台类型
	 * @return 权限列表
	 */
	List<SysPermission> queryByPlatformTypeAndRole(String roleCode, Integer platformType);

	/**
	 * 根据请求URL查询对应权限信息
	 *
	 * @param url 请求地址
	 * @return 权限实体
	 */
	SysPermission queryByUrl(String url);

	/**
	 * 根据权限ID删除权限相关的数据规则，维护数据权限表
	 *
	 * @param id 权限ID
	 */
	void deletePermRuleByPermId(String id);

	/**
	 * 查询带有特殊符号（如星号*）的菜单权限URL集合，用于特殊权限判断
	 *
	 * @return 带特殊符号权限URL列表
	 */
	List<String> queryPermissionUrlWithStar();

	/**
	 * 判断指定用户是否拥有某个权限
	 *
	 * @param username      用户名
	 * @param sysPermission 权限实体
	 * @return true：拥有权限，false：无权限
	 */
	boolean hasPermission(String username, SysPermission sysPermission);

	/**
	 * 根据用户名和请求URL判断用户是否拥有对应权限
	 *
	 * @param username 用户名
	 * @param url      请求URL
	 * @return true：有权限，false：无权限
	 */
	boolean hasPermission(String username, String url);
}

